import random

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
import json
import re
from aijia_zufang.libs.captcha.captcha import captcha
# from aijia_zufang.libs.yuntongxun.ccp_sms import CCP
import logging
logger = logging.getLogger('django')
# logger.error(错误信息)  print(错误信息)
# logger.info(信息)    print(信息)
from celery_tasks.sms.tasks import send_sms_code_func


# 图形验证码
class ImageCodeView(View):

    def get(self, request):

        uuid = request.GET.get('cur')

        # 1.调用工具类 captcha 生成图形验证码
        text, image = captcha.generate_captcha()

        # 2.链接 redis, 获取连接对象
        redis_conn = get_redis_connection('verify_code')

        # 3.利用链接对象，保存数据到 redis, 使用 setex 函数
        # redis_conn.setex('<key>', '<expire>', '<value>')
        redis_conn.setex('img_%s' % uuid, 300, text)

        # skus = SKU.objects.all()
        # for sku in skus:
        #     action_static_detail_html.delay(sku)


        # 4.返回（图片）
        return HttpResponse(image, content_type='image/jpg')


# 短信验证码
class SMSCodeView(View):

    def post(self, request ):


        # 接收参数
        dict = json.loads(request.body)
        mobile = dict.get('mobile')
        uuid = dict.get('id')
        text_client = dict.get('text')

        # 总体检验
        if not all([mobile,uuid,text_client]):
            return JsonResponse({'errno': 400,
                                 'errmsg': '缺少必传参数'})

        # mobile检验
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return JsonResponse({'errno': 400,
                                 'errmsg': 'mobile格式有误'})



        # 链接redis数据库:
        redis_conn = get_redis_connection('verify_code')

        # # 从redis数据库中获取一个flag, 查看flag是否存在
        # send_flag = redis_conn.get('send_flag_%s' % mobile)
        # # 然后判断该数据是否存在, 因为上面的数据只存储60s,
        # # 所以如果该数据存在, 则意味着, 不超过60s, 直接返回.
        # if send_flag:
        #     return JsonResponse({'errno': 400,
        #                          'errmsg': '发送短信过于频繁'})


        # 提取图形验证码
        text_server = redis_conn.get('img_%s' % uuid)

        if text_server is None:
            # 图形验证码过期或不存在
            return JsonResponse({'errno': 400,
                                 'errmsg': "图形验证码失效"})

        # 删除图形验证码，避免恶意测试图形验证码
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            logger.error(e)

        # 对比图形验证码
        # bytes 转字符串
        text_server = text_server.decode()
        # 转小写后比较
        if text_client.lower() != text_server.lower():
            return JsonResponse({'errno': 400,
                                 'errmsg': '输入图形验证码有误'})


        # 生成短信验证码：6位
        sms_code = '%06d' % random.randint(0, 999999)
        logger.info(sms_code)

        # 创建管道对象:
        pl = redis_conn.pipeline()

        # 保存短信验证码
        # redis_conn.setex('sms_%s' % mobile, 600, sms_code)
        pl.setex('sms_%s' % mobile, 600, sms_code)

        # redis_conn.setex('send_flag_%s' % mobile, 60, 1)
        pl.setex('send_flag_%s' % mobile, 60, 1)

        # 执行管道:
        pl.execute()


        # 调用容联云发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code, 5], 1)
        send_sms_code_func.delay(mobile, sms_code)

        # 返回结果
        return JsonResponse({'errno': 0,
                             'errmsg': '发送短信成功'})

